經過昨天的挑戰,我們的 ChatBot 開始能「記住對話、理解情緒、承接上下文」,接下來的挑戰是:把 ChatBot 帶到對外聊天介面,升級成一個完整的服務化系統。
在達成這個目標之前,首先得將 ChatBot 封裝成可對外呼叫的 REST API,才能讓外部網頁取得鑰匙順利對話。
這一步至關重要!
像是我們前幾天卡在 n8n 無法呼叫本地端 Python 的問題,在今天學會打造 API 之後,也能順利克服。
Pipeline 封裝:讓每個步驟有章可循
目前的 ChatBot 已經能做到:
檢索相關資料 → 生成友善回答 → 分析情緒 → 更新趨勢 → 記錄對話歷史。
這些步驟像是一組拼圖,今天的任務就是把它們封裝成一條完整的流水線,讓任何人丟一個問題就能得到智慧回答。
我們把 ChatBot 現有功能拆解成def積木,組成完整 pipeline 流水線:
# Step 1: RAG 檢索
docs = retrieve(query)
# Step 2: 生成 ChatBot 回覆
answer = generate_answer(query, docs, conversation_history)
# Step 3: 情緒分析
emotion_label, score = analyze_emotion(answer)
# Step 4: 更新趨勢統計
trend = log_trend(query, emotion_label)
# Step 5: 更新對話記錄
conversation_history.append((query, answer))
每個模組都是一個獨立的小齒輪,組合起來就是強大的智慧機器。
同時,我們導入狀態維持(stateful)的概念,讓 ChatBot 能記得前一輪的對話脈絡,從一次性問答進化成連貫多輪對話。
REST API 設計:打開通往世界的大門
使用 FastAPI 封裝 pipeline,建立 /chat 端點,接受使用者的 POST 提問。
app = FastAPI()
# --- FastAPI /chat endpoint ---
@app.post("/chat", response_model=ChatResponse)
def chat_endpoint(req: ChatRequest):
這裡有個關鍵:我們導入 Pydantic 模型,來定義資料格式,確保每次回傳結構一致:
無論前端是 網頁、LINE 還是 Streamlit,都能直接呼叫這個 API,不用動後端程式碼。
服務化:Colab + ngrok,讓全世界都能測試
我們在 Colab 上啟動 FastAPI,透過 ngrok 暴露本地服務,外部也能進行互動測試。搭配 FastAPI 自帶的 /docs ,自動生成 Swagger UI 測試介面,開發者可以直接在瀏覽器輸入問題、觀察完整回應。
nest_asyncio.apply() # 允許在 Colab event loop 中執行 uvicorn
# 建立 ngrok tunnel
!ngrok authtoken "" # 在""內填入認證金鑰
tunnel = ngrok.connect(8000)
public_url = tunnel.public_url
# 非阻塞啟動 uvicorn
def run_api():
uvicorn.run(app, host="0.0.0.0", port=8000)
threading.Thread(target=run_api, daemon=True).start()
print("API 已啟動,可透過 POST /chat 呼叫 ChatBot")
Swagger UI 測試介面可以清楚地確認資料結構以及呼叫狀態:成功回傳 200 狀態碼。

這標誌著 ChatBot 正式進入 服務化階段:不再是單機原型,而是可以被其他應用呼叫的智慧服務。
下一步的想像
今天,我們為 ChatBot 打開了 REST API 的大門,讓它正式啟航。
明天的挑戰將是:
建立一個互動式的前端聊天介面,讓使用者能像與真人對話一樣,直接與 ChatBot 互動。